package com.example.service.impl;

import com.example.mapper.changeModelMapp;
import com.example.pojo.changeModelPojo;
import com.example.service.changeModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import org.yaml.snakeyaml.events.Event;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * ClassName:changeModelImpl
 * Description:
 *
 * @Author 赵永峰
 * @Create 2024/7/17 14:44
 * @Version 1.0
 */
@Slf4j
@Service
public class changeModelImpl implements changeModelService {
    @Autowired
    private changeModelMapp changeModelMapp;
    @Value("${file.upload-dir}")
    private String saveDir;
    //插入一行新的数据
    public void insertOne(changeModelPojo changModel){
        //组合时间
        changModel.setEstablishTime(LocalDateTime.now());
        changModel.setUpdateTime(LocalDateTime.now());
        changeModelMapp.insertOne(changModel);
    }
    //根据一个字段，查询所有的数据
    public List<changeModelPojo> inquiryByOneField(String filedName , String filedVal){
        List<changeModelPojo> changeModelPojoList=changeModelMapp.inquiryByOneField(filedName,filedVal);
        return changeModelPojoList;
    }
    //修改一行的表头数据
    public void editChangeModelTable(changeModelPojo changeModel){
        changeModelMapp.editChangeModelTable(changeModel);
    }
    //修改一个int类型的字段，现在用在修改标记位上
    public void editFieldInt(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        int fieldVal=(int) parameters.get("fieldVal");
        changeModelMapp.editFielDInt(id,fieldName,fieldVal);
    }
    //修改一个字符串类型的字段，现在用在修改作业指导书上，同时也传来了旧的内容，作为修改修改记录用
    public String editChangeModelField(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String fieldVal=(String) parameters.get("fieldVal");
        String fieldValOld=(String) parameters.get("fieldValOld");
        String editUseName=(String) parameters.get("editUseName") ;
        //组合修改日期
        LocalDateTime Update=LocalDateTime.now();
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter formatterDay = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 将LocalDateTime转换为字符串
        String formattedDateTime = Update.format(formatter);
        String formattedDate = Update.format(formatterDay);
        //组合修改数据
        String editRecord="修改日期："+formattedDateTime+";"+"修改人："+editUseName+";"+"修改内容："+fieldValOld+";";
        changeModelMapp.editChangeModelField(id,fieldName,fieldVal,editRecord,formattedDate,Update);
        return fieldVal;
    }
    //上传图片的函数,
    public String editChangeModelPicture(MultipartFile file, Integer id, String fieldName, String fieldVal){
        try {
            // 记录文件名，并返回
            String fileNameAll = null;
            if (!file.isEmpty()) {
                // 生成文件的唯一名称以避免冲突
                String fileName = UUID.randomUUID() + "&&" + file.getOriginalFilename();
                String filePath = saveDir + fileName;
                File dest = new File(filePath);
                // 将文件保存到服务器上的指定位置
                file.transferTo(dest);
                // 将以前的文件名称与新的文件名称组合
                fileNameAll = fieldVal + fileName + "|*|";
                // 将数据写入到数据库中
                LocalDateTime dateTime = LocalDateTime.now();
                //根据传来的字段名，修改字段
                changeModelMapp.editFieldOneById(id, fieldName, fileNameAll, dateTime);
            }
            // 如果文件不为空且未发生异常，返回文件名列表
            return fileNameAll;
        }
        catch (IOException e) {
            // 捕获异常并返回错误消息
            throw new RuntimeException("文件保存失败：" + e.getMessage());
        }
    }
    //上传图片、视频的函数（新页面用）
    public String editChangeModelPictureNew(MultipartFile file, Integer id, String fieldName, String fieldVal, String fileName){
        try {
            if (!file.isEmpty()) {
                String filePath = saveDir + fileName;
                File dest = new File(filePath);
                // 将文件保存到服务器上的指定位置
                file.transferTo(dest);
                // 将新的作业指导书内容写入到数据库中
                LocalDateTime dateTime = LocalDateTime.now();
                //根据传来的作业指导书内容，写入到数据库中
                changeModelMapp.editFieldOneById(id,fieldName,fieldVal,dateTime);
            }
        }
        catch (IOException e) {
            // 捕获异常并返回错误消息
            throw new RuntimeException("文件保存失败：" + e.getMessage());
        }
        return fieldVal;
    }
    //读取文件，返回给前端，用作保存数据用
    public byte[] readFile(String fileName){
        File file = new File(saveDir + fileName);
        // 检查文件是否存在且可读
        if (file.exists() && file.canRead()) {
            try (FileInputStream fis = new FileInputStream(file)) {
                // 读取文件内容到byte[]数组中
                byte[] fileContent = fis.readAllBytes();
                return fileContent; // 返回文件内容的byte[]数组
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 如果文件不存在或不可读，或者读取时发生异常，返回null
        System.out.println("文件不存在或不可读：" + file.getAbsolutePath());
        return null;
    }
    //删除文件,用在图片上
    public String oilPictureRemove(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String filedVal=(String) parameters.get("filedVal");
        String pictureName=(String) parameters.get("pictureName");
        //删除文件
        String filePath =saveDir+pictureName; // 替换为你的文件路径
        // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
        Path path = Paths.get(filePath);
        try {
            //先把数据库的信息修改掉
            LocalDateTime dateTime = LocalDateTime.now();
            changeModelMapp.delPointOneFieldRemove (id, fieldName, filedVal, dateTime);
            // 使用 Files 类的 delete 方法删除指定的文件
            Files.delete(path);
            //修改数据库
            // 将数据写入到数据库中
            return filedVal;
        }
        catch (IOException e) {
            System.err.println("删除文件时出错: " + e.getMessage());
            return "删除文件时出错";
        }
    }
    //删除文件，用作新页面上
    public String PictureRemove(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String filedVal=(String) parameters.get("filedVal");
        String pictureName=(String) parameters.get("pictureName");
        //删除文件
        String filePath =saveDir+pictureName; // 替换为你的文件路径
        // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
        Path path = Paths.get(filePath);
        try {
            //先把数据库的信息修改掉
            LocalDateTime dateTime = LocalDateTime.now();
            //修改数据库
            // 将数据写入到数据库中
            changeModelMapp.editFieldOneById(id, fieldName, filedVal, dateTime);
            // 使用 Files 类的 delete 方法删除指定的文件
            Files.delete(path);
            return filedVal;
        }
        catch (IOException e) {
            System.err.println("删除文件时出错: " + e.getMessage());
            return "删除文件时出错";
        }
    }
    //根据一个id，编辑一个字段，不需要写整行的编辑
    public void editOneFiledById(Map<String, Object> map){
        Integer id=(Integer) map.get("id");
        String filedName=(String) map.get("filedName");
        String filedVal=(String) map.get("filedVal");
        changeModelMapp.editOneFiledById(id,filedName,filedVal);
    }
}
